Example Mod Content Update - #8
Conversation
Introduces ExampleBossMob, ExampleOreItem, ExampleBaseRockObject, and ExampleOreRockObject, along with their textures and localization. Refactors example incursion classes into a dedicated incursion package, updates incursion logic to use new example objects and items, and registers new mobs, items, and objects in ExampleMod. Adds ExampleAI for mob behavior and updates localization for new content.
Merge pull request #6 from Jamesp1989SL/master
Introduces ExampleAI and ExampleAILeaf classes to provide custom AI behavior for mobs, including teleporting to incursion entrance and handling chasing and wandering logic. Updates ExampleBossMob to use the new ExampleAI implementation.
Moved sword and projectile weapon classes to a new tools subpackage. Added ExampleBarItem and its associated recipe and icon. Updated item and recipe registration to use new item IDs and structure. Renamed exampleore.png to exampleoreitem.png and updated references. Updated localization and added mob icons.
Introduces a new sound file and registers it with custom settings. Adds ExamplePlaySoundPacket to trigger sound playback on clients, and updates ExampleAILeaf to send this packet when teleporting mobs. Also fixes extraction item ID in ExampleIncursionBiome and moves ExamplePacket to a dedicated packets package.
Standardized item and object IDs by removing 'item' suffixes and updating all references accordingly. Added a new ExampleStoneItem class and registered it. Updated resource file names and localization keys to match new IDs.
Added logic to send a sound packet to clients when the AI leaf fails due to proximity, ensuring sounds are played for both teleport and non-teleport cases. Also added examplestone.png to resources.
Introduces landscaping recipes for examplebaserock and exampleorerock in ExampleRecipes.java. Updates textures for examplebaserock.png, exampleorerock.png, and exampleore.png to reflect new or improved visuals.
Introduces ExampleLootTable and ExamplePreset classes for custom loot and structure generation. Updates ExampleIncursionLevel to use the new preset, demonstrating how to place custom structures and fill them with loot during incursion level generation.
Refactored ExamplePreset to use a script-based preset application instead of manual tile/object placement. Added ExamplePresetCode for the original code-based preset logic, and introduced MissingTextureReporter utility for handling missing texture errors with logging and on-screen notifications.
Introduced ExampleWallWindowDoorObject with registration logic for wall, door, and window objects. Added corresponding textures and updated localization entries for the new objects. Updated ExampleMod to register these new objects during initialization.
Split ExampleMod initialization logic into dedicated loader classes for buffs, commands, incursions, items, mobs, objects, packets, projectiles, resources, and tiles. This improves code organization and readability. Also, moved ExampleRecipes and removed the unused MissingTextureReporter utility.
Introduces example helmet, chestplate, and boots armor items with set bonus buff, including textures and registration. Adds ExampleModCategories for item and crafting category trees, updates item and recipe loaders, and reorganizes example items and buffs into subpackages for better structure. Updates localization for new items, buffs, and categories.
Reworked ExampleModCategories to align with vanilla creative menu roots and subcategories, and updated item/crafting category registration for mod objects. Modified ExampleModObjects to assign new categories to registered objects and added a new object and recipe (exampleobject2) using the new mod-specific category. Updated localization keys to match new category names and structure.
Introduces new ExampleTreeObject, ExampleTreeSaplingObject, ExampleLogItem, and ExampleWoodChairObject classes, along with their registration in loaders and crafting recipes. Adds related item/object categories, updates localization, and includes new/updated resource images for these items and objects. Also renames ExampleSwordItem to ExampleSwordWeapon.
Added 'examplesapling' to the loot table and updated the English localization with 'examplechair'. Also updated the examplesound.ogg sound asset.
Expanded documentation and inline comments in ExampleLootTable, ExamplePreset, and ExamplePresetCode to clarify the structure, usage, and logic of presets and loot tables. These changes improve code readability and serve as a guide for developers learning how to create and use presets and loot tables in the mod.
Add a new Gradle task (preAntialiasTextures) to run PreAntialiasTextures via Necesse.jar for processing all resource texture folders. The task is grouped under "necesse" and accepts the project resource directories as a semicolon-separated argument. Numerous PNG assets were updated as a result of running the pre-antialiasing process.
Introduce a new example grass system and reorganize map/incursion packages: - Add ExampleBiome (examples.maps.biomes) and new ExampleModBiomes loader; ExampleMod now loads biomes. - Implement overworld biome generation, spawn tables, generator stack and region placement logic. - Add ExampleGrassTile (terrain splatter tile) with growth/spread, loot and rendering logic, plus splat texture. - Add ExampleGrassObject (drops ExampleGrassSeed) and ExampleGrassSeedItem (places examplegrasstile). - Register new tile/object/item in ExampleModTiles, ExampleModObjects and ExampleModItems. - Add resource assets: item and object textures and tile splat PNGs. - Update locale/en.lang with names for new tile, object and seed. - Move incursion/map classes into examples.maps.incursion and rename ExampleTile package to examples.tiles; remove old incursion ExampleBiome file. These changes add a complete example grass biome + gameplay loop (tile growth, objects, and seed drops) and tidy up package structure for map/incursion examples.
Introduce example event plumbing and a placeable object demonstrating LevelEvent and GameEvent usage. Adds ExampleLevelEvent (server-side level event) and ExampleEvent (lightweight game event), an ExampleLevelEventObject that spawns the level event and triggers the game event, and ExampleModEvents to register the level event and a listener. Updates ExampleMod to load the events and registers the new object in ExampleModObjects. Also adds sprites for the object and a locale entry (en.lang).
Introduce a summon weapon and associated summon mob plus event-driven demo changes. Added ExampleSummonOrbWeapon, ExampleSummonWeaponMob, ExampleObjectEntity and new item/mob textures; registered the summon mob and item, and added an iron anvil recipe for the summon orb. Expanded ExampleLevelEvent to support server-side damage/health-change logic and client-side particle effects, plus proper spawn packet serialization. Replaced direct object interaction with an ObjectEntity (ExampleObjectEntity) for tile-based triggers and refactored ExampleLevelEventObject to spawn that entity. Renamed projectile/sword classes and assets for clarity (ExampleProjectileWeapon -> ExampleMagicProjectileWeapon, ExampleSwordWeapon -> ExampleMeleeSwordWeapon) and updated item registrations, recipes, and locale keys/tooltips accordingly. Misc: minor formatting and comments updates across examples and resource additions/deletions for new sprites.
Introduce arrow ammo, a ranged bow, projectile, and associated regen buff plus assets and registry updates. Adds ExampleArrowItem (arrow stats and projectile lookup), ExampleRangedBowWeapon (bow stats/behavior), ExampleArrowProjectile (custom draw, target filtering, hit logic that applies a 4s regen buff and 50% drop chance), and ExampleArrowBuff (server-side heal over time: 5 HP per 250ms). Registers new items, ammo and projectiles in ExampleModItems/ExampleModProjectiles and registers the buff in ExampleModBuffs. Also renamed/moved several example classes/packages (ExampleArmorSetBonusBuff -> ExampleArmorSetBuff, ExampleMagicProjectileWeapon -> ExampleMagicStaffWeapon, ExampleProjectile moved into projectiles package) and updated localization entries and sprite resources.
Introduce mod settings and a small settler/job system plus related objects, packets and patches. - Add ExampleModSettings (persistent mod config) and expose it as ExampleMod.settings via initSettings(). - Register new job type and level job (ExampleLevelJob) and load it from ExampleModJobs; add safe job-finder patch to avoid null handlers. - Add settler/settler-mob classes (ExampleSettler, ExampleSettlerMob) and register them via ExampleModSettlers and ExampleModMobs. - Add job-triggering world object and entity (ExampleJobObject, ExampleJobObjectEntity) that scans nearby tiles and enqueues ExampleLevelJob jobs. - Add a config-driven object (ExampleConfigObject) and a client->server packet (ExampleConfigInteractPacket) that reads/updates ExampleModSettings and saves server settings. - Enhance ExampleMod to load the new loaders (jobs, settlers, packets, objects) and small fixes/renames of package layouts for patches/presets/objectentity. - Add ExampleArrowBuff improvements (server-side heal logic using gndData) and several resource images and localization entries for new items/objects/jobs. These changes demonstrate using persistent settings, custom objects/object entities, jobs/settlers integration, packet handling, and a defensive patch for job finding.
Rename the patch from JobFinder_StreamFoundJobs_NoNullHandlersPatch to JobFinderStreamFoundJobslHandlersPatch
Introduce boss-summoning and related world features: add ExampleBossSummonItem (+sprite), ExampleModJournal, trap object entity, wall-trap and pressure-plate objects, and a wall-trap sprite. Expose and register tile/object IDs in ExampleModTiles and ExampleModObjects, register the new consumable in ExampleModItems, and update locale entries. Enhance biome support and loot: extend ExampleBiome with cave/deep-cave tiles/rock IDs, generator veins, chest-room presets that use rotating loot, and extra mob drops (including the boss summon item) for cave levels. Update ExampleLootTable with rotation and new loot entries. Behaviour and misc fixes: simplify AI leaf to play a sound packet once, override boss mob collision filter, adjust ExampleBaseRockObject tool tier, add ExampleTrapObjectEntity and ExampleWallTrapObject logic, and reorder registration calls in ExampleMod.init to ensure correct load order. Also rename a patch class for JobFinder stream handlers.
Introduce an example trinket and wire it into the mod: add ExampleTrinketItem and ExampleTrinketBuff, register the trinket item and its buff in ExampleModItems and ExampleModBuffs, and include a sprite and localization tooltip. Other changes: - Add locale entries for the trinket and clean up a few tooltip/localization strings. - Improve ExampleArrowBuff: clarify comments, rename variables for clarity, and simplify the heal timing/logic while preserving behavior (server-side heal event usage remains). - Minor cleanup in ExampleAI (remove stray comment line) and add necessary imports. Files added: ExampleTrinketItem.java, ExampleTrinketBuff.java, exampletrinketitem.png Files modified: ExampleModItems.java, ExampleModBuffs.java, ExampleArrowBuff.java, ExampleAI.java, en.lang
…le rotation Call settings.logLoadedSettings() during mod init and make the settings logger public so loaded settings are printed for debugging (added GlobalData import and exposed logLoadedSettings()). Update example loot table to use a trinket item in the rotation (replace exampleboots with exampletrinketitem). Enhance ExampleBossMob loot: add imports for LootItem and RotationLootItem, define a regular lootTable and a private rotating uniqueDrops with a privateLootTable, and implement getPrivateLootTable() so each player can receive a unique boss drop rotation. Add exampletrinketitem to ExampleLootTable rotation
Renamed and reorganized many example classes/IDs and improved example job logic and items for clarity. Key changes: - Renamed item/object/buff IDs and usages for consistency (e.g. examplearmorsetbonus -> examplearmorsetbonusbuff, exampletrinketitem -> exampletrinket, pressure plate/trap IDs shortened). - Renamed several tool classes/files and updated imports/registrations (ExampleRangedBowWeapon -> ExampleBowRangedWeapon, ExampleMagicStaffWeapon -> ExampleStaffMagicWeapon, ExampleSummonOrbWeapon -> ExampleOrbSummonWeapon); removed old ExampleMeleeSwordWeapon and added ExampleSwordMeleeWeapon. - Job system updates: job type "weeding" -> "examplejobtype", level job registration updated, ExampleJobObjectEntity and ExampleSettlerMob updated to use new IDs. - Reworked ExampleLevelJob: added Javadoc, saving behavior, comprehensive job sequence (MineObjectActiveJob) with reservation, pickup handling and removal on completion. - Buff and armor set: adjusted registration ID and ExampleArmorSetBuff made passive/un-cancellable and documented; ExampleHelmetArmorItem updated to new buff ID. - ExampleGrassTile: clarified behavior, added JavaDoc, cleaned loot logic and off-screen grow scheduling helper; several minor fixes and comments. - Small cleanups: removed unused imports, updated comments/formatting, minor API casts/usage fixes, resource filename tweaks, and several class renames (presets/patches) for clarity. Overall this commit standardizes naming, fixes registrations across loaders/usage sites, and expands example job/item implementations to be more complete and robust.
…s of other tiles and objects.
…n of how the preset data is stored and work.
There was a problem hiding this comment.
🟡 Changes recommended
Boss summoning, command registration, AI termination, localization, and server-setting authorization have unresolved defects.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Expands the example mod into a comprehensive reference implementation with modular registration, world content, combat, settlement, networking, and configuration examples.
Changes:
- Splits registration into dedicated loaders and reorganizes packages.
- Adds biomes, presets, objects, equipment, mobs, AI, jobs, events, and recipes.
- Expands localization, resources, settings, and loot systems.
File summaries
| File | Description |
|---|---|
src/main/resources/locale/en.lang |
Expands localization entries. |
src/main/java/examplemod/loaders/ExampleModTiles.java |
Registers custom tiles. |
src/main/java/examplemod/loaders/ExampleModTech.java |
Registers crafting technology. |
src/main/java/examplemod/loaders/ExampleModSettlers.java |
Registers the settler. |
src/main/java/examplemod/loaders/ExampleModResources.java |
Loads textures and sound. |
src/main/java/examplemod/loaders/ExampleModRecipes.java |
Registers content recipes. |
src/main/java/examplemod/loaders/ExampleModProjectiles.java |
Registers projectiles. |
src/main/java/examplemod/loaders/ExampleModPackets.java |
Registers network packets. |
src/main/java/examplemod/loaders/ExampleModObjects.java |
Registers world objects. |
src/main/java/examplemod/loaders/ExampleModMobs.java |
Registers mobs and NPCs. |
src/main/java/examplemod/loaders/ExampleModJournal.java |
Adds journal entries. |
src/main/java/examplemod/loaders/ExampleModJobs.java |
Registers settlement jobs. |
src/main/java/examplemod/loaders/ExampleModItems.java |
Registers items and equipment. |
src/main/java/examplemod/loaders/ExampleModIncursions.java |
Registers incursion content. |
src/main/java/examplemod/loaders/ExampleModEvents.java |
Registers level events. |
src/main/java/examplemod/loaders/ExampleModCommands.java |
Encapsulates command registration. |
src/main/java/examplemod/loaders/ExampleModCategories.java |
Adds item categories. |
src/main/java/examplemod/loaders/ExampleModBuffs.java |
Registers custom buffs. |
src/main/java/examplemod/loaders/ExampleModBiomes.java |
Registers biome and preset. |
src/main/java/examplemod/examples/tiles/ExampleTile.java |
Repackages and documents tile. |
src/main/java/examplemod/examples/tiles/ExampleGrassTile.java |
Adds spreading grass tile. |
src/main/java/examplemod/examples/settlement/settlers/ExampleSettler.java |
Defines recruitable settler. |
src/main/java/examplemod/examples/settlement/jobs/ExampleLevelJob.java |
Implements grass-clearing job. |
src/main/java/examplemod/examples/projectiles/ExampleProjectile.java |
Repackages example projectile. |
src/main/java/examplemod/examples/projectiles/ExampleArrowProjectile.java |
Adds healing arrow projectile. |
src/main/java/examplemod/examples/presets/ExampleWorldPreset.java |
Integrates procedural preset generation. |
src/main/java/examplemod/examples/presets/ExamplePreset.java |
Defines reusable structure preset. |
src/main/java/examplemod/examples/patches/ExampleMethodPatch.java |
Repackages method patch. |
src/main/java/examplemod/examples/patches/ExampleConstructorPatch.java |
Repackages constructor patch. |
src/main/java/examplemod/examples/packets/ExamplePacket.java |
Repackages and documents packet. |
src/main/java/examplemod/examples/objects/ExampleWorkstationObject.java |
Adds multi-tile workstation. |
src/main/java/examplemod/examples/objects/ExampleWorkstation2Object.java |
Adds workstation secondary tile. |
src/main/java/examplemod/examples/objects/ExampleWallTrapObject.java |
Adds wall trap object. |
src/main/java/examplemod/examples/objects/ExampleTreeSaplingObject.java |
Adds custom sapling. |
src/main/java/examplemod/examples/objects/ExampleTreeObject.java |
Adds custom tree. |
src/main/java/examplemod/examples/objects/ExamplePressurePlateObject.java |
Adds pressure plate. |
src/main/java/examplemod/examples/objects/ExampleOreRockObject.java |
Adds ore-bearing rock. |
src/main/java/examplemod/examples/objects/ExampleObject.java |
Reworks basic object example. |
src/main/java/examplemod/examples/objects/ExampleJobObject.java |
Adds job-producing object. |
src/main/java/examplemod/examples/objects/ExampleGrassObject.java |
Adds harvestable grass. |
src/main/java/examplemod/examples/objects/ExampleEventTriggerObject.java |
Adds event-triggering object. |
src/main/java/examplemod/examples/objects/ExampleConfigObject.java |
Adds interactive settings object. |
src/main/java/examplemod/examples/objects/ExampleBaseRockObject.java |
Adds base rock object. |
src/main/java/examplemod/examples/objectentity/ExampleTrapObjectEntity.java |
Implements arrow trap behavior. |
src/main/java/examplemod/examples/objectentity/ExampleObjectEntity.java |
Implements event trigger behavior. |
src/main/java/examplemod/examples/objectentity/ExampleJobObjectEntity.java |
Scans and creates jobs. |
src/main/java/examplemod/examples/mobs/ExampleSummonWeaponMob.java |
Adds summon companion mob. |
src/main/java/examplemod/examples/mobs/ExampleMob.java |
Adds teleporting custom AI. |
src/main/java/examplemod/examples/mobs/ExampleHumanMob.java |
Adds recruitable human NPC. |
src/main/java/examplemod/examples/mobs/ExampleBossMob.java |
Adds boss combat behavior. |
src/main/java/examplemod/examples/maps/incursion/ExampleIncursionLevel.java |
Expands incursion generation. |
src/main/java/examplemod/examples/maps/incursion/ExampleIncursionBiome.java |
Uses custom boss and ore. |
src/main/java/examplemod/examples/maps/biomes/ExampleBiome.java |
Adds full biome generation. |
src/main/java/examplemod/examples/items/trinkets/ExampleTrinketItem.java |
Adds spelunker trinket. |
src/main/java/examplemod/examples/items/tools/ExampleSwordMeleeWeaponItem.java |
Adds melee weapon. |
src/main/java/examplemod/examples/items/tools/ExampleStaffMagicWeaponItem.java |
Reworks magic staff. |
src/main/java/examplemod/examples/items/tools/ExampleOrbSummonWeaponItem.java |
Adds summon weapon. |
src/main/java/examplemod/examples/items/tools/ExampleBowRangedWeaponItem.java |
Adds ranged weapon. |
src/main/java/examplemod/examples/items/materials/ExampleStoneItem.java |
Adds placeable stone material. |
src/main/java/examplemod/examples/items/materials/ExampleOreItem.java |
Adds ore material. |
src/main/java/examplemod/examples/items/materials/ExampleMaterialItem.java |
Relocates base material. |
src/main/java/examplemod/examples/items/materials/ExampleLogItem.java |
Adds log material. |
src/main/java/examplemod/examples/items/materials/ExampleGrassSeedItem.java |
Adds grass seed. |
src/main/java/examplemod/examples/items/materials/ExampleBarItem.java |
Adds refined bar. |
src/main/java/examplemod/examples/items/ExamplePotionItem.java |
Removes old potion class. |
src/main/java/examplemod/examples/items/ExampleMaterialItem.java |
Removes old material class. |
src/main/java/examplemod/examples/items/ExampleHuntIncursionMaterialItem.java |
Removes obsolete incursion item. |
src/main/java/examplemod/examples/items/consumable/ExamplePotionItem.java |
Adds relocated potion. |
src/main/java/examplemod/examples/items/consumable/ExampleFoodItem.java |
Repackages food item. |
src/main/java/examplemod/examples/items/consumable/ExampleBossSummonItem.java |
Adds boss summon consumable. |
src/main/java/examplemod/examples/items/armor/ExampleHelmetArmorItem.java |
Adds set helmet. |
src/main/java/examplemod/examples/items/armor/ExampleChestArmorItem.java |
Adds regenerative chest armor. |
src/main/java/examplemod/examples/items/armor/ExampleBootsArmorItem.java |
Adds armor boots. |
src/main/java/examplemod/examples/items/ammo/ExampleArrowItem.java |
Adds healing arrow ammunition. |
src/main/java/examplemod/examples/ExampleSwordItem.java |
Removes old sword class. |
src/main/java/examplemod/examples/ExampleObject.java |
Removes old object class. |
src/main/java/examplemod/examples/ExampleLootTable.java |
Adds shared loot table. |
src/main/java/examplemod/examples/ExampleBiome.java |
Removes minimal biome class. |
src/main/java/examplemod/examples/events/ExampleLevelEvent.java |
Adds synchronized level event. |
src/main/java/examplemod/examples/buffs/ExampleTrinketBuff.java |
Adds trinket modifier. |
src/main/java/examplemod/examples/buffs/ExampleBuff.java |
Repackages base buff. |
src/main/java/examplemod/examples/buffs/ExampleArrowBuff.java |
Implements gradual healing. |
src/main/java/examplemod/examples/buffs/ExampleArmorSetBuff.java |
Adds armor-set bonuses. |
src/main/java/examplemod/examples/ai/ExampleBossAI.java |
Implements staged boss AI. |
src/main/java/examplemod/examples/ai/ExampleAINode.java |
Adds teleport AI node. |
src/main/java/examplemod/examples/ai/ExampleAI.java |
Composes hostile mob AI. |
src/main/java/examplemod/ExampleModSettings.java |
Adds persistent mod settings. |
src/main/java/examplemod/ExampleMod.java |
Orchestrates modular initialization. |
Review details
- Files reviewed: 88/158 changed files
- Comments generated: 5
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
🔵 Needs a closer look
It contains stale-job and teleport defects, an unauthorized persistent configuration mutation, missing resources/localization, and described packets that were not implemented.
Review details
Suppressed comments (6)
Previously missed (4) — in code that hasn't changed since the last review.
src/main/java/examplemod/examples/ai/ExampleAINode.java:62
- The candidate list includes the mob's current tile. Because this implementation's
teleportalways returns true, randomly selecting that tile cancels the projectile hit and starts the 10-second cooldown without moving the mob. Exclude the current tile so a successful result always represents a real reposition.
src/main/java/examplemod/examples/settlement/jobs/ExampleLevelJob.java:82 getObject()is explicitly nullable here, buttarget.objectis dereferenced unconditionally when building the activity message. If the grass disappears after the job is selected, sequence creation will throw instead of abandoning the stale job; return no sequence/remove the job whentargetis null before constructing the message.
src/main/java/examplemod/loaders/ExampleModBuffs.java:19- This visible set-bonus buff relies on the default buff texture lookup, but there is no
resources/buffs/examplearmorsetbonusbuff.png(the directory only containsexamplebuff.png). Client resource loading/display will therefore request a missing asset; add the matching icon or override texture loading to use an existing one.
src/main/java/examplemod/loaders/ExampleModPackets.java:10 - The PR description lists
ExampleConfigInteractPacketandExamplePlaySoundPacketas additions, but this loader registers only the pre-existingExamplePacket, and neither promised packet class exists in the source tree. Add and register both packets, or update the PR scope if they are intentionally excluded.
src/main/java/examplemod/examples/objects/ExampleConfigObject.java:89
- Any regular player who can interact with this craftable object can increment and persist a server-wide setting. Server-side range validation does not provide authorization, so multiplayer users can alter configuration and force repeated disk writes; gate this action behind an admin/owner permission or make it non-persistent/player-scoped.
src/main/resources/locale/en.lang:8 - The ore-rock object is registered as
exampleorerock, so its display name is looked up as[object].exampleorerock. Thisexampleoreentry instead duplicates the item key and leaves the placeable ore rock without its localization.
- Files reviewed: 88/158 changed files
- Comments generated: 0 new
- Review effort level: Balanced
New additions
Mod infrastructure / loaders
AI
Buffs
Events / Level events
Tiles
Objects
Object entities
Items
Materials / misc items
Armor items
Weapons
Trinkets
Mobs / NPCs
Settlement
Projectiles
Presets
Networking / packets
Patches
Loot / utility